//+------------------------------------------------------------------+
//|                                               MovingAverages.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 简单移动平均线 (Simple Moving Average)                           |
//|                                                                  |
//| 计算指定位置的简单移动平均值                                      |
//| @param position 计算位置(索引)                                   |
//| @param period 移动平均周期                                       |
//| @param price 价格数组                                            |
//| @return 简单移动平均值                                           |
//+------------------------------------------------------------------+
double SimpleMA(const int position, const int period, const double &price[]);

//+------------------------------------------------------------------+
//| 指数移动平均线 (Exponential Moving Average)                     |
//|                                                                  |
//| 计算指定位置的指数移动平均值                                      |
//| @param position 计算位置(索引)                                   |
//| @param period 移动平均周期                                       |
//| @param prev_value 前一个指数移动平均值                           |
//| @param price 价格数组                                            |
//| @return 指数移动平均值                                           |
//+------------------------------------------------------------------+
double ExponentialMA(const int position, const int period, const double prev_value, const double &price[]);

//+------------------------------------------------------------------+
//| 平滑移动平均线 (Smoothed Moving Average)                         |
//|                                                                  |
//| 计算指定位置的平滑移动平均值                                      |
//| @param position 计算位置(索引)                                   |
//| @param period 移动平均周期                                       |
//| @param prev_value 前一个平滑移动平均值                           |
//| @param price 价格数组                                            |
//| @return 平滑移动平均值                                           |
//+------------------------------------------------------------------+
double SmoothedMA(const int position, const int period, const double prev_value, const double &price[]);

//+------------------------------------------------------------------+
//| 线性加权移动平均线 (Linear Weighted Moving Average)              |
//|                                                                  |
//| 计算指定位置的线性加权移动平均值                                  |
//| @param position 计算位置(索引)                                   |
//| @param period 移动平均周期                                       |
//| @param price 价格数组                                            |
//| @return 线性加权移动平均值                                       |
//+------------------------------------------------------------------+
double LinearWeightedMA(const int position, const int period, const double &price[]);

//+------------------------------------------------------------------+
//| 在缓冲区上计算简单移动平均线                                     |
//|                                                                  |
//| 在价格数组上计算简单移动平均并将结果存入缓冲区                    |
//| @param rates_total 总的数据点数量                                |
//| @param prev_calculated 之前已计算的数据点数量                    |
//| @param begin 有效数据起始位置                                    |
//| @param period 移动平均周期                                       |
//| @param price 价格数组                                            |
//| @param buffer 计算结果缓冲区                                    |
//| @return 已计算的数据点数量                                       |
//+------------------------------------------------------------------+
int SimpleMAOnBuffer(const int rates_total, const int prev_calculated, const int begin, const int period, const double &price[], double &buffer[]);

//+------------------------------------------------------------------+
//| 在缓冲区上计算指数移动平均线                                     |
//|                                                                  |
//| 在价格数组上计算指数移动平均并将结果存入缓冲区                    |
//| @param rates_total 总的数据点数量                                |
//| @param prev_calculated 之前已计算的数据点数量                    |
//| @param begin 有效数据起始位置                                    |
//| @param period 移动平均周期                                       |
//| @param price 价格数组                                            |
//| @param buffer 计算结果缓冲区                                    |
//| @return 已计算的数据点数量                                       |
//+------------------------------------------------------------------+
int ExponentialMAOnBuffer(const int rates_total, const int prev_calculated, const int begin, const int period, const double &price[], double &buffer[]);

//+------------------------------------------------------------------+
//| 在缓冲区上计算线性加权移动平均线(经典方法)                        |
//|                                                                  |
//| 在价格数组上计算线性加权移动平均并将结果存入缓冲区                |
//| @param rates_total 总的数据点数量                                |
//| @param prev_calculated 之前已计算的数据点数量                    |
//| @param begin 有效数据起始位置                                    |
//| @param period 移动平均周期                                       |
//| @param price 价格数组                                            |
//| @param buffer 计算结果缓冲区                                    |
//| @return 已计算的数据点数量                                       |
//+------------------------------------------------------------------+
int LinearWeightedMAOnBuffer(const int rates_total, const int prev_calculated, const int begin, const int period, const double &price[], double &buffer[]);

//+------------------------------------------------------------------+
//| 在缓冲区上计算线性加权移动平均线(快速方法)                        |
//|                                                                  |
//| 在价格数组上计算线性加权移动平均并将结果存入缓冲区                |
//| @param rates_total 总的数据点数量                                |
//| @param prev_calculated 之前已计算的数据点数量                    |
//| @param begin 有效数据起始位置                                    |
//| @param period 移动平均周期                                       |
//| @param price 价格数组                                            |
//| @param buffer 计算结果缓冲区                                    |
//| @param weight_sum 权重和(用于优化计算)                          |
//| @return 已计算的数据点数量                                       |
//+------------------------------------------------------------------+
int LinearWeightedMAOnBuffer(const int rates_total, const int prev_calculated, const int begin, const int period, const double &price[], double &buffer[], int &weight_sum);

//+------------------------------------------------------------------+
//| 在缓冲区上计算平滑移动平均线                                     |
//|                                                                  |
//| 在价格数组上计算平滑移动平均并将结果存入缓冲区                    |
//| @param rates_total 总的数据点数量                                |
//| @param prev_calculated 之前已计算的数据点数量                    |
//| @param begin 有效数据起始位置                                    |
//| @param period 移动平均周期                                       |
//| @param price 价格数组                                            |
//| @param buffer 计算结果缓冲区                                    |
//| @return 已计算的数据点数量                                       |
//+------------------------------------------------------------------+
int SmoothedMAOnBuffer(const int rates_total, const int prev_calculated, const int begin, const int period, const double &price[], double &buffer[]);
//+------------------------------------------------------------------+